package com.jt;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jt.blog.domain.Tag;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.net.UnknownHostException;
import java.util.List;

@SpringBootApplication
@EnableCaching
public class RedisApplication {

    public static void main(String[] args) {

        SpringApplication.run(RedisApplication.class,args);


    }

//    //代码定制参考RedisAutoConfiguration类
//    @Bean
//    @ConditionalOnMissingBean(
//            name = {"redisTemplate"}
//    )
//    public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
//
//        System.out.println("===redisTemplate===");
//        RedisTemplate<Object,Object> template = new RedisTemplate();
//        template.setConnectionFactory(redisConnectionFactory);
//
//        //定义redisTemplate对象的序列化方式
//        //1.定义key的序列化方式
//        StringRedisSerializer stringRedisSerializer=new StringRedisSerializer();
//        template.setKeySerializer(stringRedisSerializer);
//        template.setHashKeySerializer(stringRedisSerializer);
//
//        //2.定义Value的序列化方式
//        Jackson2JsonRedisSerializer jsonRedisSerializer=
//                new Jackson2JsonRedisSerializer(Object.class);
//        ObjectMapper objectMapper=new ObjectMapper();
//        objectMapper.setVisibility(PropertyAccessor.ALL,
//                JsonAutoDetect.Visibility.ANY);
//        objectMapper.activateDefaultTyping(
//                objectMapper.getPolymorphicTypeValidator(),
//                ObjectMapper.DefaultTyping.NON_FINAL,
//                JsonTypeInfo.As.PROPERTY);
//        jsonRedisSerializer.setObjectMapper(objectMapper);
//        template.setValueSerializer(jsonRedisSerializer);
//        template.setHashValueSerializer(jsonRedisSerializer);
//
//        //3.修改redisTemplate默认特性设置（除了序列化，其他原有特性不丢）
//        template.afterPropertiesSet();
//        return template;
//
//    }

}
//序列化：
//狭义层次：将对象转为字节（I/O）
//广义层次：将对象转为指定格式字符串（例如json）
//封装：
//狭义层面：属性私有化，方法能公开则公开
//广义层面：一个系统有哪些服务（子系统），一个服务有哪些模块，一个模块有哪些对象，一个对象有哪些属性
